import request from "../utils/request.js";
import axios from "axios";
import getConfig from "../utils/config.js";
import {elPrompt} from "../utils/elPrompt.ts";

/**
 * 通过id获取文档
 * @param documentId 文档id
 * @param callback 回调函数
 * @returns {Promise<void>}
 */
export async function getDocumentById(documentId, callback) {
    await request.get(`/document/get/${documentId}`).then(callback)
}

/**
 * 文件上传
 * @param file 文件
 * @param onProgress 上传进度回调函数
 * @param onFinish 上传完成回调函数
 * @param onError 发生错误回调函数
 */
export async function uploadDocument(file, onProgress, onFinish, onError) {
    const formData = new FormData();
    formData.append('documentFile', file);
    const token = localStorage.getItem('token')
    try {
        await request.post('/document/upload', formData, {
            headers: {
                'Content-Type': 'multipart/form-data',
            },
            onUploadProgress: onProgress
        }).then(onFinish);
    } catch (error) {
        onError(error)
    }
}

/**
 * 通过文档id删除文档
 * @param documentId 文档id
 * @param callback 回调函数
 * @returns {Promise<void>}
 */
export async function deleteDocumentById(documentId, callback) {
    request.delete(`/document/delete/${documentId}`).then(callback)
}

/**
 * 通过文档id批量删除文档
 * @param documentIds 文档id列表
 * @param callback 回调函数
 * @returns {Promise<void>}
 */
export async function deleteDocumentsByIds(documentIds, callback) {
    await request.post('/document/delete',
        {
            ids: documentIds
        }
    ).then(callback)
}

/**
 * 更新文档
 * @param document 文档信息
 * @param callback 回调函数
 * @returns {Promise<void>}
 */
export async function updateDocument(document, callback) {
    await request.post('/document/update', document).then(callback)
}

/**
 * 分页获取用户的文档
 * @param userId 用户id
 * @param callback 回调函数
 * @param pageNumber 页码
 * @param searchTitle 搜索标题
 * @param searchKeyword 搜索关键词
 * @param pageSize 每页大小
 * @returns {Promise<void>}
 */
export async function getUserDocuments(userId,
                                       callback,
                                       pageNumber = 1,
                                       pageSize = 10,
                                       searchTitle = '',
                                       searchKeyword = '') {
    await request.post(`/document/get/user/${userId}`, {
        pageNo: pageNumber,
        pageSize: pageSize,
        searchTitle: searchTitle,
        searchKeyword: searchKeyword
    }).then(callback)
}

/**
 * 分页搜索文档
 * @param callback 回调函数
 * @param pageNumber 页码
 * @param pageSize 每页大小
 * @param searchUser 搜索用户
 * @param searchTitle 搜索标题
 * @param searchKeyword 搜索关键词
 * @returns {Promise<void>}
 */
export async function searchDocuments(callback,
                                       pageNumber = 1,
                                       pageSize = 10,
                                       searchUser = '',
                                       searchTitle = '',
                                       searchKeyword = '') {
    await request.post('/document/search', {
        pageNo: pageNumber,
        pageSize: pageSize,
        searchTitle: searchTitle,
        searchKeyword: searchKeyword,
        searchUser: searchUser
    }).then(callback)
}

/**
 * 下载文档
 * @param documentId 文档id
 * @returns {Promise<void>}
 */
export async function downloadDocument(documentId) {
    const token = localStorage.getItem('token')
    let serverUrl = ''
    await getConfig((config) => {
        serverUrl = config['serverUrl']
    });
    await axios.get(`${serverUrl}/document/download/${documentId}`, {
        headers: {
            Authorization: token
        },
        responseType: 'blob'
    })
        .then(async (response) => {
            const contentType = response.headers['content-type']
            const regularExpression = /.*(application\/json)+.*/
            if (regularExpression.test(contentType)) {
                response.data.text().then(resultStr => {
                    const result = JSON.parse(resultStr)
                    elPrompt(result.message, "error");
                })
                return
            }
            const blob = new Blob([response.data]); // 创建一个Blob
            const a = document.createElement('a'); // 创建一个a标签
            a.style.display = 'none'; // 设置a标签样式
            const url = window.URL.createObjectURL(blob); // 创建一个Blob URL
            a.href = url; //将Blob URL赋值给a标签的href属性
            let filename = 'fileName' // 获取文件名
            await getDocumentById(documentId, (result) => {
                filename = result.data.title
            })
            a.download = filename; // 设置下载的文件名
            document.body.appendChild(a); // 将a标签添加到文档中
            a.click(); // 触发点击事件，开始下载
            window.URL.revokeObjectURL(url); // 清理创建的URL对象
            document.body.removeChild(a); // 移除a标签
            elPrompt('下载完成！', "success");
        })
        .catch(error => elPrompt(error, "error"));
}

/**
 * 通过文档id冻结文档
 * @param documentId
 * @param callback
 * @returns {Promise<void>}
 */
export async function freezeDocumentByDocumentId(documentId, callback) {
    await request.post(`/document/freeze/${documentId}`).then(callback)
}

/**
 * 通过文档id解冻文档
 * @param documentId
 * @param callback
 * @returns {Promise<void>}
 */
export async function unFreezeDocumentByDocumentId(documentId, callback) {
    await request.post(`/document/unfreeze/${documentId}`).then(callback)
}

/**
 * 通过用户id冻结文档
 * @param userId 用户id
 * @param callback 回调函数
 * @returns {Promise<void>}
 */
export async function freezeDocumentsByUserId(userId, callback) {
    await request.post(`/document/freeze/user/${userId}`).then(callback)
}

/**
 * 通过用户id解冻文档
 * @param userId 用户id
 * @param callback 回调函数
 * @returns {Promise<void>}
 */
export async function unFreezeDocumentsByUserId(userId, callback) {
    await request.post(`/document/unfreeze/user/${userId}`).then(callback)
}

/**
 * 搜索所有文档
 * @param pageNumber 页码
 * @param pageSize 每页数量
 * @param searchTitle 搜索标题
 * @param callback 回调函数
 * @returns {Promise<void>}
 */
export async function documentList(pageNumber = 1, pageSize = 10, searchTitle = '', callback) {
    await request.get('/document/list', {
        params: {
            searchTitle: searchTitle,
            pageNumber: pageNumber,
            pageSize: pageSize
        }
    }).then(callback)
}

/**
 * 修改文档评论区状态
 * @param documentId 文档id
 * @param callback 回调函数
 * @returns {Promise<void>}
 */
export async function changeDocumentCommentStatus(documentId, callback) {
    await request.post(`/document/changecommentstatus/${documentId}`).then(callback)
}